console.log("可读流（Readable streams）是对提供数据的 源头 （source）的抽象，" +
    "资源的数据流并不是直接流向消费者，而是先 push 到缓存池，缓存池有一个水位标记 highWatermark，" +
    "超过这个标记阈值，push 的时候会返回 false，从而控制读取数据流的速度，如同水管上的阀门，当水管面装满了水，" +
    "就暂时关上阀门，不再从资源里“抽水”出来。(查看readerStream01.png)");
console.log("可读流有两种模式，flowing和pause");
console.log("flowing模式下 可读流可自动从资源读取数据");
console.log("pause模式下 需要显式调用stream.read()方法来读取数据");
console.log("缓存池就像一个空的水桶，消费者通过管口接水，同时，资源池就像一个水泵，不断地往水桶中泵水，" +
    "而 highWaterMark 是水桶的浮标，达到阈值就停止蓄水。下面是一个简单的flowing模式 Demo：");

const Readable = require("stream").Readable;

class MyReadable extends Readable {
  constructor(dataSource, options) {
    super(options);
    this.dataSource = dataSource;
  }

  //_read表示需要从MyReadable类内部调用该方法
  _read() {
    const data = this.dataSource.makeData();
    this.push(data);
  }
}

//模拟资源池
const dataSource = {
  data: new Array("abcdefghijklmnopqrstuvwxyz"),
  makeData: function () {
    if (!this.data.length) {
      return null;
    }
    return this.data.pop();
  }
};

// const myReadable = new MyReadable(dataSource);
// myReadable.setEncoding("utf8");
// myReadable.on("data", function (chunk) {
//   console.log(chunk);
// });

console.log("可读流另一种模式是pause模式，这种模式下可读流有三种状态");
console.log("readable._readableState.flowing = null 目前没有数据消费者，所以不会从资源库中读取数据");
console.log("readable._readableState.flowing = false 暂停从资源库读取数据，但 不会 暂停数据生成，" +
    "主动触发了 readable.pause() 方法， readable.unpipe() 方法， 或者接收 “背压”（back pressure）可达到此状态");
console.log("readable._readableState.flowing = true 正在从资源库中读取数据，监听 'data' 事件，" +
    "调用 readable.pipe() 方法，或者调用 readable.resume() 方法可达到此状态");
console.log("见readerStream02.png");
console.log("一个简单的切换状态的demo：");

const myReadable = new MyReadable(dataSource);
myReadable.setEncoding("utf8");
// myReadable.on('data', (chunk) => {
//   console.log(`Received ${chunk.length} bytes of data.`);
//   myReadable.pause()
//   console.log('pausing for 1 second');
//   setTimeout(()=>{
//     console.log('now restart');
//     myReadable.resume()
//   }, 1000);
// });
myReadable.on('readable', () => {
  let chunk;
  while (null !== (chunk = myReadable.read(5))) {//每次读5个字节
    console.log(`Received ${chunk.length} bytes of data.`, chunk);
  }
});

